class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int m = dungeon.size(), n = dungeon[0].size();
        // dp[i][j] 表示：从 [i, j] 位置出发，到达终点时所需的最低初始健康点数
        vector<vector<int>> dp(m+1, vector<int>(n+1, INT_MAX)); // 多开一行一列
        dp[m][n-1] = dp[m-1][n] = 1;
        for(int i = m-1; i >= 0; --i)
        {
            for(int j = n-1; j >= 0; --j)
            {
                dp[i][j] = min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j];
                if(dp[i][j] < 1)
                    dp[i][j] = 1;
            }
        }
        return dp[0][0];
    }
};